typedef boost::shared_ptr<gnutls_session_t> session_ptr_t;
typedef boost::shared_ptr< std::vector<char> > buffer_ptr_t;
-class mutex {
-public:
- mutex() {
-#ifdef WIN32
- repr = CreateMutex(0, FALSE, 0);
-#else
- pthread_mutex_init(&repr, NULL);
-#endif
- }
-
- void lock() {
-#ifdef WIN32
- WaitForSingleObject(repr, INFINITE);
-#else
- pthread_mutex_lock(&repr);
-#endif
- }
-
- void unlock() {
-#ifdef WIN32
- ReleaseMutex(repr);
-#else
- pthread_mutex_unlock(&repr);
-#endif
- }
-
- ~mutex()
- {
-#ifdef WIN32
- CloseHandle(repr);
-#else
- pthread_mutex_destroy(&repr);
-#endif
- }
-
-private:
- mutex( const mutex& );
- const mutex& operator=( const mutex& );
-
-#ifdef WIN32
- HANDLE repr;
-#else
- pthread_mutex_t repr;
-#endif
-};
-
-static int gcry_tunnel_mutex_init(void **priv)
-{
- if (!priv)
- return -1;
- *priv = new mutex();
- return 0;
-}
-
-static int gcry_tunnel_mutex_destroy(void **priv)
-{
- if (!priv || !*priv)
- return -1;
- delete reinterpret_cast<mutex*>(*priv);
- return 0;
-}
-
-static int gcry_tunnel_mutex_lock(void **priv)
-{
- reinterpret_cast<mutex*>(*priv)->lock();
- return 0;
-}
-
-static int gcry_tunnel_mutex_unlock(void **priv)
-{
- reinterpret_cast<mutex*>(*priv)->unlock();
- return 0;
-}
-
-static struct gcry_thread_cbs gcry_threads_tunnel =
-{ GCRY_THREAD_OPTION_USER, NULL,
- gcry_tunnel_mutex_init, gcry_tunnel_mutex_destroy,
- gcry_tunnel_mutex_lock, gcry_tunnel_mutex_unlock,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
-
bool Proxy::tls_tunnel_init() {
- if (gcry_control(GCRYCTL_SET_THREAD_CBS, &tls_tunnel::gcry_threads_tunnel) != 0)
- return false;
if (gnutls_global_init() != 0)
return false;
return true;